/**
 * 应用角标管理工具
 *
 * 支持平台：
 * - iOS: 完美支持，使用原生API
 * - Android: 支持主流厂商（华为、小米、OPPO、vivo、魅族等）
 *
 * 使用示例：
 * ```typescript
 * import { BadgeManager } from '@/utils/badge'
 *
 * // 设置角标
 * BadgeManager.setBadge(5)
 *
 * // 清除角标
 * BadgeManager.clearBadge()
 *
 * // 增加角标
 * BadgeManager.increaseBadge(1)
 * ```
 */

export class BadgeManager {
  private static currentBadgeCount: number = 0
  private static isInitialized: boolean = false
  private static BADGE_STORAGE_KEY = 'app_badge_count' // 持久化存储的 key

  /**
   * 初始化推送模块
   * 注意：只在App环境且未初始化时执行
   */
  private static async init() {
    // #ifdef APP-PLUS
    if (this.isInitialized) {
      return
    }

    try {
      // 🔥 从本地存储恢复角标数量
      const savedBadge = this.loadBadgeFromStorage()
      if (savedBadge > 0) {
        this.currentBadgeCount = savedBadge
        console.log('[BadgeManager] 从存储恢复角标数量:', savedBadge)
      }

      // 获取客户端标识（ClientID）
      const clientInfo = await this.getClientInfo()
      console.log('[BadgeManager] 推送初始化成功，ClientID:', clientInfo.clientid)

      // 监听推送消息（可选，用于在线推送）
      this.setupPushListener()

      this.isInitialized = true
    } catch (error) {
      console.warn('[BadgeManager] 推送初始化失败:', error)
    }
    // #endif
  }

  /**
   * 获取客户端标识信息
   */
  private static async getClientInfo(): Promise<any> {
    // #ifdef APP-PLUS
    return new Promise((resolve) => {
      try {
        plus.push.getClientInfo()
        plus.push.getClientInfoAsync(
          (info: any) => {
            resolve(info)
          },
          (error: any) => {
            console.warn('[BadgeManager] 获取ClientInfo失败:', error)
            resolve({ clientid: 'unknown' })
          },
        )
      } catch (error) {
        console.warn('[BadgeManager] 获取ClientInfo异常:', error)
        resolve({ clientid: 'unknown' })
      }
    })
    // #endif
    // #ifndef APP-PLUS
    return Promise.resolve({ clientid: 'web-client' })
    // #endif
  }

  /**
   * 设置推送消息监听器
   * 用于App在前台时接收推送通知
   */
  private static setupPushListener() {
    // #ifdef APP-PLUS
    plus.push.addEventListener(
      'receive',
      (msg: any) => {
        console.log('[BadgeManager] 收到推送消息:', msg)

        // 如果消息包含角标数，自动更新
        if (msg.payload && msg.payload.badge) {
          this.setBadge(msg.payload.badge)
        }
      },
      false,
    )

    plus.push.addEventListener(
      'click',
      (msg: any) => {
        console.log('[BadgeManager] 点击推送消息:', msg)

        // 点击通知后可以跳转到对应页面
        // 根据msg.payload.type进行不同的跳转逻辑
      },
      false,
    )
    // #endif
  }

  /**
   * 从本地存储恢复角标数量
   */
  private static loadBadgeFromStorage(): number {
    try {
      const saved = uni.getStorageSync(this.BADGE_STORAGE_KEY)
      if (saved !== null && saved !== undefined && !isNaN(Number(saved))) {
        return Number(saved)
      }
    } catch (e) {
      console.warn('[BadgeManager] 读取角标存储失败:', e)
    }
    return 0
  }

  /**
   * 保存角标数量到本地存储
   */
  private static saveBadgeToStorage(count: number): void {
    try {
      uni.setStorageSync(this.BADGE_STORAGE_KEY, count)
    } catch (e) {
      console.warn('[BadgeManager] 保存角标存储失败:', e)
    }
  }

  /**
   * 设置应用角标数字
   * @param count 角标数字（0表示清除角标）
   * @param options 可选配置
   *   - silent: 静默更新，不创建通知（默认false）
   *   - isIncrease: 是否是增加（用于判断是否需要通知）
   */
  static async setBadge(count: number, options: { silent?: boolean; isIncrease?: boolean } = {}) {
    if (count < 0) {
      count = 0
    }

    const oldCount = this.currentBadgeCount
    this.currentBadgeCount = count

    // 🔥 持久化保存角标数量
    this.saveBadgeToStorage(count)

    // #ifdef APP-PLUS
    try {
      // 确保初始化
      await this.init()

      const platform = uni.getSystemInfoSync().platform

      if (platform === 'ios') {
        // iOS使用原生API设置角标（静默，不创建通知）
        plus.runtime.setBadgeNumber(count)
        console.log('[BadgeManager] iOS角标已设置为:', count, options.silent ? '(静默)' : '')
      } else if (platform === 'android') {
        // Android角标处理
        // 注意：Android的角标支持依赖厂商，不是所有机型都支持

        // 如果是静默模式，只记录日志，不创建通知
        if (options.silent) {
          console.log('[BadgeManager] Android角标静默更新为:', count)
          // 可以在这里调用原生插件静默设置角标（如果有）
          // 暂时只记录，不创建打扰用户的通知
          return
        }

        // 非静默模式：只在角标增加时创建通知（服务端推送场景）
        if (count > oldCount || !options.silent) {
          const options_push = {
            badge: count,
            cover: true,
            title: '办公系统',
            content: count > 0 ? `您有${count}个待办事项` : '所有待办已完成',
            when: new Date(),
          }

          plus.push.createMessage(
            options_push.content,
            JSON.stringify({
              badge: count,
              type: 'badge_update',
            }),
            options_push,
          )

          console.log('[BadgeManager] Android角标已设置为:', count, '(创建通知)')
        } else {
          console.log('[BadgeManager] Android角标未增加，跳过通知:', count)
        }
      }
    } catch (error) {
      console.error('[BadgeManager] 设置角标失败:', error)
    }
    // #endif

    // #ifndef APP-PLUS
    console.log('[BadgeManager] 非App环境，角标设置为:', count)
    // #endif
  }

  /**
   * 清除应用角标
   */
  static clearBadge() {
    this.setBadge(0)
  }

  /**
   * 增加角标数字
   * @param increment 增加的数量（默认为1）
   */
  static async increaseBadge(increment: number = 1) {
    const newCount = this.currentBadgeCount + increment
    await this.setBadge(newCount)
  }

  /**
   * 减少角标数字
   * @param decrement 减少的数量（默认为1）
   */
  static async decreaseBadge(decrement: number = 1) {
    const newCount = Math.max(0, this.currentBadgeCount - decrement)
    await this.setBadge(newCount)
  }

  /**
   * 获取当前角标数字
   */
  static getCurrentBadge(): number {
    return this.currentBadgeCount
  }

  /**
   * 获取客户端ID（用于服务端推送）
   * 可以将此ID上传到服务器，用于服务端推送
   */
  static async getClientId(): Promise<string> {
    // #ifdef APP-PLUS
    try {
      const info = await this.getClientInfo()
      return info.clientid || ''
    } catch (error) {
      console.error('[BadgeManager] 获取ClientID失败:', error)
      return ''
    }
    // #endif

    // #ifndef APP-PLUS
    return 'web-client'
    // #endif
  }

  /**
   * 请求推送权限（iOS需要）
   */
  static async requestPushPermission(): Promise<boolean> {
    // #ifdef APP-PLUS
    try {
      // iOS 10+ 需要主动请求推送权限
      const platform = uni.getSystemInfoSync().platform
      if (platform === 'ios') {
        // iOS平台，检查权限
        return Promise.resolve(true)
      } else {
        // Android平台，默认允许
        return Promise.resolve(true)
      }
    } catch (error) {
      console.warn('[BadgeManager] 推送权限请求失败:', error)
      return Promise.resolve(false)
    }
    // #endif

    // #ifndef APP-PLUS
    return Promise.resolve(true)
    // #endif
  }
}

/**
 * 导出便捷方法
 */
export const setBadge = (count: number) => BadgeManager.setBadge(count)
export const clearBadge = () => BadgeManager.clearBadge()
export const increaseBadge = (increment?: number) => BadgeManager.increaseBadge(increment)
export const decreaseBadge = (decrement?: number) => BadgeManager.decreaseBadge(decrement)
export const getCurrentBadge = () => BadgeManager.getCurrentBadge()
export const getClientId = () => BadgeManager.getClientId()
export const requestPushPermission = () => BadgeManager.requestPushPermission()
